﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.Models;
using Comissoes.JQGridObject;
using Comissoes.Utilities;

namespace Comissoes.Controllers
{
    public class PessoasController : AppController
    {
        xcontEntities db = new xcontEntities();

        public ActionResult Edit(PESSOAS pessoa)
        {
            return View(pessoa);
        }

        public ActionResult OperadorUpdate()
        {
            return View();
        }

        public ActionResult Details(PESSOAS pessoa)
        {
            return PartialView(pessoa);
        }

        public JsonResult PessoaSearch(String VALOR_PSDC)
        {
            VALOR_PSDC = VALOR_PSDC.Replace(".", "").Replace("/", "").Replace("-", "");

            var pessoa = (from c in db.DOCUMENTOS_PESSOA.Include("PESSOAS").ToList()
                          where c.VALOR_PSDC == VALOR_PSDC
                          select new
                          {
                              c.PESSOAS.ID_PESSOA,
                              c.PESSOAS.NOME_PESSOA,
                              c.PESSOAS.FANTASIA_PESSOA,
                              c.PESSOAS.OBS_PESSOA,
                              NASCIMENTO_PESSOA = String.Format("{0:dd/MM/yyyy}",c.PESSOAS.NASCIMENTO_PESSOA),
                              ANIVERSARIO_PESSOA = String.Format("{0:dd/MM}",c.PESSOAS.NASCIMENTO_PESSOA)
                          }).FirstOrDefault();

            return Json(pessoa, JsonRequestBehavior.AllowGet);
        }

        // Lista os emails da pessoa
        public ActionResult EnderecosList(string sidx, string sord, int page, int rows, bool _search, string searchField, string searchOper, string searchString, Int32 ID_PESSOA)
        {
            var q = from c in db.ENDERECOS_PESSOA
                                .Include("PESSOAS")
                                .Include("ENDERECOS")
                                .Include("TIPOS_ENDERECO")
                                .Include("ENDERECOS.LOGRADOUROS")
                                .Include("ENDERECOS.BAIRROS")
                                .Include("ENDERECOS.BAIRROS.CIDADES")
                                .Include("ENDERECOS.BAIRROS.CIDADES.UFS").ToList()
                    where c.PESSOAS.ID_PESSOA == ID_PESSOA
                    select new
                    {
                        c.PESSOAS.ID_PESSOA,
                        c.ID_ENPS,
                        c.TIPOS_ENDERECO.DESC_TPEN,
                        LOGR_END = string.Format("{0} {1}{2}{3}",
                            c.ENDERECOS.LOGRADOUROS.NOME_LOGRAD,
                            c.ENDERECOS.LOGR_END,
                            string.IsNullOrEmpty(c.NUMERO_ENPS) ? string.Empty : ", " + c.NUMERO_ENPS,
                            string.IsNullOrEmpty(c.COMPL_ENPS) ? string.Empty : " - " + c.COMPL_ENPS
                        ),
                        c.ENDERECOS.BAIRROS.NOME_BAIRRO,
                        c.ENDERECOS.BAIRROS.CIDADES.NOME_CID,
                        c.ENDERECOS.BAIRROS.CIDADES.UFS.SIGLA_UF,
                        CEP_END = string.Format("{0}-{1}", c.ENDERECOS.CEP_END.Substring(0, 5), c.ENDERECOS.CEP_END.Substring(5, 3))
                    };

            JQGridBuilder jbuilder = new JQGridBuilder(q.AsQueryable(), page, sidx, sord, searchField, searchString, searchOper, "ID_ENPS", _search, rows);

            return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
        }

        // Confirma a exclusão do endereço
        public ActionResult EnderecoDelete(Int32? id)
        {
            List<string> erros = new List<string>();
            try
            {
                db.DeleteObject(db.ENDERECOS_PESSOA.First(t => t.ID_ENPS == id));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }


        // Lista os emails da pessoa
        public ActionResult Emails()
        {
            return PartialView();
        }

        // Lista os emails da pessoa
        public ActionResult EmailsList(string sidx, string sord, int page, int rows, bool _search, string searchField, string searchOper, string searchString)
        {
            Int32? ID_PESSOA = Convertions.Inteiro(Request["ID_PESSOA"]); ;
            var q = from c in db.EMAILS
                    where c.PESSOAS.ID_PESSOA == ID_PESSOA
                    select new
                    {
                        act = String.Empty,
                        c.ID_EMAIL,
                        c.ENDERECO_EMAIL,
                        c.OBS_EMAIL
                    };

            JQGridBuilder jbuilder = new JQGridBuilder(q.AsQueryable(), page, sidx, sord, searchField, searchString, searchOper, "ID_EMAIL", _search, rows);

            return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
        }

        // Exibe view de edição de email
        public ActionResult EmailEdit(Int32? id)
        {
            return PartialView();
        }

        // Confirma a inclusão do novo email
        public ActionResult EmailUpdate(Int32? ID_PESSOA, Int32? ID_EMAIL, String ENDERECO_EMAIL, String OBS_EMAIL)
        {
            List<string> erros = new List<string>();

            if (string.IsNullOrEmpty(ENDERECO_EMAIL))
                erros.Add("É necessário informar o endereço de email");

            else if (!ID_EMAIL.HasValue && db.EMAILS.Any(t => t.ENDERECO_EMAIL == ENDERECO_EMAIL))
                erros.Add("Este email já encontra-se cadastrado para" + db.EMAILS.Include("PESSOAS").FirstOrDefault(t => t.ENDERECO_EMAIL == ENDERECO_EMAIL).PESSOAS.NOME_PESSOA);

            if (!ENDERECO_EMAIL.Contains("@")) 
                erros.Add("Email inválido, o endereço deve conter '@'");

            if (!erros.Any())
            {
                try
                {
                    EMAILS email;

                    if (ID_EMAIL.HasValue)
                        email = db.EMAILS.FirstOrDefault(t => t.ID_EMAIL == ID_EMAIL);
                    else
                    {
                        email = new EMAILS { PESSOAS = db.PESSOAS.FirstOrDefault(t => t.ID_PESSOA == ID_PESSOA) };
                        db.AddToEMAILS(email);
                    }

                    email.ENDERECO_EMAIL = ENDERECO_EMAIL;
                    email.OBS_EMAIL = OBS_EMAIL;

                    db.SaveChanges();

                    return Json(true, JsonRequestBehavior.AllowGet);
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                }
            }
            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        //Exclui um email
        public ActionResult EmailDelete()
        {
            List<string> erros = new List<string>();

            try
            {
                Int32 ID_EMAIL = Int32.Parse(Request["id"]);
                db.DeleteObject(db.EMAILS.FirstOrDefault(t => t.ID_EMAIL == ID_EMAIL));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        // Retorna a lista de telefones da pessoa
        public ActionResult Fones( int? ID_PESSOA)
        {
            return PartialView();
        }

        // Lista os telefones da pessoa
        public ActionResult FonesList(string sidx, string sord, int page, int rows, bool _search, string searchField, string searchOper, string searchString, Int32 ID_PESSOA)
        {
            var q = from c in db.TELEFONES
                    where c.PESSOAS.ID_PESSOA == ID_PESSOA
                    select new
                    {
                        act = "",
                        c.ID_FONE,
                        c.NUMERO_FONE,
                        c.OBS_FONE
                    };

            Dictionary<string, string> formats = new Dictionary<string, string>
            {
                { "NUMERO_FONE", "D" }
            };

            JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ID_FONE", _search, rows, formats);

            return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
        }

        // Confirma a edição do telefone
        public ActionResult FoneUpdate(Int32? ID_FONE, Int32? ID_PESSOA, String NUMERO_FONE, String OBS_FONE)
        {
            List<string> erros = new List<string>();

            if (string.IsNullOrEmpty(NUMERO_FONE))
                erros.Add("É necessário informar o número do telefone");

            else if (db.TELEFONES.Any(t => t.PESSOAS.ID_PESSOA == ID_PESSOA && t.NUMERO_FONE == NUMERO_FONE))
                erros.Add("Telefone já cadastrado para esta pessoa");

            if (!erros.Any())
            {
                try
                {
                    TELEFONES fone = new TELEFONES { PESSOAS = db.PESSOAS.FirstOrDefault(t => t.ID_PESSOA == ID_PESSOA) };
                    if (ID_FONE.HasValue)
                        fone = db.TELEFONES.FirstOrDefault(t => t.ID_FONE == ID_FONE);
                    else
                        db.AddToTELEFONES(fone);

                    fone.NUMERO_FONE = NUMERO_FONE.Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "");
                    fone.OBS_FONE = OBS_FONE;

                    db.SaveChanges();

                    return Json(true, JsonRequestBehavior.AllowGet);
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                }
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        // Exclui um telefone
        public ActionResult FoneDelete()
        {
            List<string> erros = new List<string>();

            try
            {
                Int32 ID_FONE = Int32.Parse(Request["id"]);
                db.DeleteObject(db.TELEFONES.FirstOrDefault(t => t.ID_FONE == ID_FONE));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        // Retorna os documentos da pessoa
        public ActionResult Documentos()
        {
            return PartialView();
        }

        public JsonResult TiposDocumentos()
        {
            return Json(Comissoes.Utilities.Formats.Documentos(), JsonRequestBehavior.AllowGet);
        }

        // Lista os documentos da pessoa
        public ActionResult DocumentosList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchOper, String searchString, Int32 ID_PESSOA)
        {
            var q = from c in db.DOCUMENTOS_PESSOA.Include("PESSOAS")
                    where c.PESSOAS.ID_PESSOA == ID_PESSOA
                    select new
                    {
                        act = String.Empty,
                        c.ID_PSDC,
                        COD_DOC = c.DOCUMENTOS.DESC_DOC,
                        SIGLA_UF = c.UF_PSDC,
                        VALOR_PSDC = c.VALOR_PSDC + "|" + c.DOCUMENTOS.DESC_DOC + "|" + c.UF_PSDC
                    };

            Dictionary<string, string> formats = new Dictionary<string, string>
            {
                { "VALOR_PSDC", "C" }
            };

            JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ID_PSDC", _search, rows, formats);

            return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
        }

        // Confirma a edição do documento
        public ActionResult DocumentoUpdate(Int32? ID_PSDC, Int32? ID_PESSOA, Int32? COD_DOC, String VALOR_PSDC, String SIGLA_UF)
        {
            List<string> erros = new List<string>();
            VALOR_PSDC = Convertions.Documento(VALOR_PSDC);

            if (!COD_DOC.HasValue)
                erros.Add("É necessário informar o tipo do documento");

            if (string.IsNullOrEmpty(VALOR_PSDC))
                erros.Add("É necessário informar o número do documento");

            else if (db.DOCUMENTOS_PESSOA.Any(t => t.PESSOAS.ID_PESSOA == ID_PESSOA && t.VALOR_PSDC == VALOR_PSDC))
                erros.Add("Documento já cadastrado para esta pessoa");

            var documeto = db.DOCUMENTOS_PESSOA.Include("PESSOAS").FirstOrDefault(t => t.VALOR_PSDC == VALOR_PSDC);
            if (documeto != null)
            {
                erros.Add("Documento já cadastrado para " + documeto.PESSOAS.NOME_PESSOA);
            }

            switch (COD_DOC)
            {
                case 1: // CPF
                    if (!Validations.Cpf(VALOR_PSDC))
                    {
                        erros.Add("Cpf inválido.");
                    }
                    break;
                case 2: // CNPJ
                    if (!Validations.Cnpj(VALOR_PSDC))
                    {
                        erros.Add("Cnpj inválido.");
                    }
                    break;
                case 3: // IE
                    if (!Validations.IE(SIGLA_UF, VALOR_PSDC))
                    {
                        erros.Add("Inscrição Estadual inválida neste UF.");
                    }
                    break;
            }

            if (!erros.Any())
            {
                try
                {
                    DOCUMENTOS_PESSOA documento = new DOCUMENTOS_PESSOA();

                    if (ID_PSDC.HasValue)
                    {
                        documento = db.DOCUMENTOS_PESSOA.FirstOrDefault(t => t.ID_PSDC == ID_PSDC);
                    }
                    else
                    {
                        db.AddToDOCUMENTOS_PESSOA(documento);
                        documento.PESSOAS = db.PESSOAS.FirstOrDefault(t => t.ID_PESSOA == ID_PESSOA);
                    }

                    documento.VALOR_PSDC = VALOR_PSDC;
                    documento.DOCUMENTOS = db.DOCUMENTOS.FirstOrDefault(t => t.COD_DOC == COD_DOC);

                    db.SaveChanges();

                    return Json(new { result = true }, JsonRequestBehavior.AllowGet);
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                }
            }

            return Json(new { result = false, erros = erros }, JsonRequestBehavior.AllowGet);
        }

        // Confirma a exclusão do documento
        public ActionResult DocumentoDelete()
        {
            List<string> erros = new List<string>();

            try
            {
                Int32 ID_PSDC = Int32.Parse(Request["id"]);
                db.DeleteObject(db.DOCUMENTOS_PESSOA.FirstOrDefault(t => t.ID_PSDC == ID_PSDC));
                db.SaveChanges();

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
            }

            return Json(erros, JsonRequestBehavior.AllowGet);
        }

        // Valida o documento digitado
        public JsonResult ValidaDocumento(String VALOR_PSDC, String TIPO_PESSOA)
        {
            if (VALOR_PSDC.Length == 0)
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }

            Boolean valido = true;

            switch (TIPO_PESSOA)
            {
                case "F":
                    valido = Validations.Cpf(VALOR_PSDC);
                    break;
                case "J":
                    valido = Validations.Cnpj(VALOR_PSDC);
                    break;
            }

            return Json(valido, JsonRequestBehavior.AllowGet);
        }
    }
}
